/*************************************************************************
	> File Name: oj-40_stage_challenge.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月13日 星期五 22时07分44秒
 ************************************************************************/
#include <algorithm>
#include <cstdio>

int ans[505][1000] = {{0, 0}, {0, 0}, {1, 1}, {1, 1}};

void bigAdd(int *ans, int *a, int *b) {
    //定义临时数组ta存放a的逆序，ans暂存b的逆序
    //节省数组开销
    int ta[1000] = {0};
    ta[0] = std::max(a[0], b[0]);
    for (int i = a[0], j = 1; i >= 1; --i, ++j) {
        ta[j] = a[i];
    }
    for (int i = b[0], j = 1; i >= 1; --i, ++j) {
        ans[j] = b[i];
    }
    //把逆序对应位相加和存到ta中
    for (int i = 1; i <= ta[0]; ++i) {
        ta[i] = ta[i] + ans[i];
        //如果产生进位，处理进位
        if (ta[i] > 9) {
            ta[i + 1] += 1;
            ta[i] %= 10;
            //如果进位是最高位，那么数长+1
            if (i == ta[0]) ta[0] += 1;
        }
    }
    //答案数组的数位=结果数组的数位
    ans[0] = ta[0];
    //将结果覆盖到答案数组中去
    for (int i = ta[0], j = 1; i >= 1; --i, ++j) {
        ans[j] = ta[i];
    }
}

int main() {
    int n;
    scanf("%d", &n);
    if (n < 4) {
        printf("%d\n", ans[n][1]);
        return 0;
    }
    for (int i = 4; i <= n; ++i) {
        bigAdd(ans[i], ans[i - 2], ans[i - 3]);
    }
    for (int i = 1; i <= ans[n][0]; ++i) {
        printf("%d", ans[n][i]);
    }
    printf("\n");
    return 0;
}
